Матч 324, Упаковка продуктов (ProductBundling)

Дивизион 2, Уровень 3

 

Компания, продавая продукты, желает упаковывать их в пакеты. Информация о покупаемых продуктах находится в массиве строк data. Известно, что data[i][j] = 1, если i - ый покупатель покупает j - ый товар, иначе data[i][j] = 0. Два продукта могут быть упакованы в один пакет, если их либо покупают все покупатели, либо никто не покупает. Один пакет может содержать один товар, а каждый товар должен быть обязательно упакован в пакет. Необходимо найти наименьшее количество пакетов, необходимое для упаковки всех продуктов.

 

Класс: ProductBundling

Метод: int howManyBundles(vector<string> data)

Ограничения: data содержит от 1 до 50 элементов, каждый элемент  data содержит одинаковое количество символов, от 1 до 50.

 

Вход. Массив data, содержащий информацию о покупаемых продуктах.

 

Выход. Наименьшее количество пакетов, необходимое для упаковки всех продуктов.

 

Пример входа

data

{"11100"}

{"1010", "1100"}

{"1100000000",

"1100000000",

"0011000000",

"0011000000",

"0000110000",

"0000110000",

"0000001100",

"0000001100",

"0000000011",

"0000000011"}

 

Пример выхода

2

4

5

 

 

РЕШЕНИЕ

обработка строк + структуры данных

 

Транспонируем матрицу data, после чего data[i][j] равно 1, если i - ый товар покупает j - ый покупатель. Товары i и j могут быть упакованы в один пакет тогда и только тогда, когда они одновременно продаются (или не продаются) всем покупателям, то есть если строки data[i] и data[j] одинаковы. Определяем и возвращаем количество разных строк в транспонированной матрице data.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <string>

#include <set>

using namespace std;

 

class ProductBundling

{

public:

  int howManyBundles(vector<string> data)

  {

    set<string> s;

    string temp;

    int i, j;

    for(i = 0; i < data[0].size(); i++)

    {

      for(temp = "", j = 0; j < data.size(); j++) temp = temp + data[j][i];

      s.insert(temp);

    }

    return s.size();

  }

};